﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs

Namespace Comptes

    ''' <summary>
    ''' Classe repésentant les indicateurs
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Indicateurs_V2
        Inherits CalculCompose

        Private _parametresEntree As Parametres

        ''' <summary>
        ''' Constructeur
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
            _resultats = New ResultatsIndicateurs
        End Sub

        ''' <summary>
        ''' Données initiales utilisées pour faire les calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ParametresEntree() As Parametres
            Get
                Return _parametresEntree
            End Get
            Friend Set(ByVal value As Parametres)
                _parametresEntree = value
            End Set
        End Property

        ''' <summary>
        ''' Résultats des clculs des indicateurs
        ''' </summary>
        ''' <remarks>
        ''' 
        ''' </remarks>
        Public Overloads ReadOnly Property Resultats() As ResultatsIndicateurs
            Get
                Return _resultats
            End Get
        End Property

        ''' <summary>
        ''' Calcule des indicateurs
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub procedureCalcul()

            Dim resultatsCalcul As New ResultatsIndicateurs
            With _parametresEntree
                ReDim resultatsCalcul.ROE_resNetsFdsPropres(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.ROE_resNetsCapiAlloues(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.SP_techDC(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.SP_techINCINV(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.SP_techTot(.nbAnneesProjetees - 1)

                For i = 1 To .nbAnneesProjetees
                    resultatsCalcul.ROE_resNetsFdsPropres(i - 1) = _
                        IIf((.ApprortSolvabilite(i - 1) + .CapitauxSociauxOuv(i - 1)) <> 0, _
                            .Resultat(i - 1) / (.ApprortSolvabilite(i - 1) + .CapitauxSociauxOuv(i - 1)), _
                            0)
                    resultatsCalcul.ROE_resNetsCapiAlloues(i - 1) = _
                        IIf(.CapitauxAlloues(i - 1) <> 0, .Resultat(i - 1) / .CapitauxAlloues(i - 1), 0)
                    Dim pTechDC As Double = .primesHT_DC(i - 1) * (1 - .Fg - .ComPartenaire)
                    Dim pTechINCINV As Double = (.primesHT_IT(i - 1) / (1 + .taxe)) * (1 - .Fg - .ComPartenaire)
                    Dim sinDC As Double = .sinRegles_DC(i - 1)
                    Dim sinINCINV As Double = .sinRegles_IT(i - 1)
                    resultatsCalcul.SP_techDC(i - 1) = IIf(pTechDC <> 0, sinDC / pTechDC, 0)
                    resultatsCalcul.SP_techINCINV(i - 1) = IIf(pTechINCINV <> 0, sinINCINV / pTechINCINV, 0)
                    resultatsCalcul.SP_techTot(i - 1) = IIf((sinDC + sinINCINV) <> 0, _
                                                       (sinDC + sinINCINV) / (pTechDC + pTechINCINV), 0)
                Next


                Me.calculeTRI(_parametresEntree.FluxActionnaire, resultatsCalcul)
                resultatsCalcul.VAN = calculeVAN(.Rend_AnnAttendu, .FluxActionnaire)
                resultatsCalcul.VANprimes = calculeVAN(.Rend_AnnAttendu, .primesHT_DC)
            End With

            _resultats = resultatsCalcul

        End Sub

        ''' <summary>
        ''' Calcule du TRI
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub calculeTRI(ByVal tableauFluxFinanciers() As Double, ByVal ResultatsCalcul As ResultatsIndicateurs)
            Try
                'Dim partNeg As Double = 0
                'Dim partPos As Double = 0
                'For i As Integer = 0 To tableauFluxFinanciers.Length - 1
                '    If tableauFluxFinanciers(i) >= 0 Then partPos = partPos + tableauFluxFinanciers(i) Else partNeg = partNeg + tableauFluxFinanciers(i)
                'Next
                'Dim fluxNet As Double = partPos + partNeg
                'Dim valInit As Double = fluxNet / partPos
                'If valInit <= -0.5 Then
                '    valInit = -0.5
                'ElseIf valInit >= 0.5 Then
                '    valInit = 0.5
                'Else
                '    valInit = 0.1
                'End If
                ResultatsCalcul.TRI = IRR(tableauFluxFinanciers, 0)
                ResultatsCalcul.isTRIvalide = True
            Catch ex As Exception
                ResultatsCalcul.TRI = 0
                ResultatsCalcul.isTRIvalide = False
            End Try
        End Sub

        Private Sub CalculeVAPosSurVAneg(ByVal taux As Double, ByVal tableauFluxFinanciers() As Double)

        End Sub

        ''' <summary>
        ''' Calcule de la VAN
        ''' </summary>
        ''' <remarks></remarks>
        Private Function calculeVAN(ByVal taux As Double, ByVal tableauFluxFinanciers() As Double) As Double
            Try
                Return NPV(taux, tableauFluxFinanciers)
            Catch ex As Exception
                Return 0
            End Try
        End Function

        ''' <summary>
        ''' Parametre utilisé pour évaluer les indicateurs
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Parametres

            ''' <summary>
            ''' Nombre d'années de projection
            ''' </summary>
            ''' <remarks>
            ''' 
            ''' </remarks>
            Public Property nbAnneesProjetees As Integer

            ''' <summary>
            ''' Représente l rendement annuel attendu
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Rend_AnnAttendu As Double

            ''' <summary>
            ''' Représnte le flux avec  les actionnaires
            ''' </summary>
            ''' <remarks></remarks>
            Public Property FluxActionnaire As Double()

            ''' <summary>
            ''' Représente les capitaux sociaux ouverts
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapitauxSociauxOuv As Double()

            ''' <summary>
            ''' Représente l'apport en solvabilité
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ApprortSolvabilite As Double()

            ''' <summary>
            ''' Représente le résultat
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Resultat As Double()

            ''' <summary>
            ''' Représente les capitaux alloués
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapitauxAlloues As Double()

            ''' <summary>
            ''' Représente les primes hors taxe pour le rique deces
            ''' </summary>
            ''' <remarks></remarks>
            Public Property primesHT_DC As Double()

            ''' <summary>
            ''' Représente les primes hors taxe pour le rique incapacité travail
            ''' </summary>
            ''' <remarks></remarks>
            Public Property primesHT_IT As Double()

            ''' <summary>
            ''' Représente le montant des sinistres réglés pour le rique deces
            ''' </summary>
            ''' <remarks></remarks>
            Public Property sinRegles_DC As Double()

            ''' <summary>
            ''' Représente le montant des sinistres réglés pour le rique incapacité travail
            ''' </summary>
            ''' <remarks></remarks>
            Public Property sinRegles_IT As Double()

            ''' <summary>
            ''' Frais de gestion annuels
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Fg As Double

            ''' <summary>
            ''' Représente lac commission versées aux partenaires
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ComPartenaire As Double

            ''' <summary>
            ''' Représente la Taxe
            ''' </summary>
            ''' <remarks></remarks>
            Public Property taxe As Double
        End Class

        ''' <summary>
        ''' Résultats du calcul des indicateurs
        ''' </summary>
        ''' <remarks></remarks>
        Public Class ResultatsIndicateurs
            'Création des tableaux attendus en sortie du compte

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ROE_resNetsFdsPropres As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ROE_resNetsCapiAlloues As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SP_techDC As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SP_techINCINV As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SP_techTot As Double()

            ''' <summary>
            ''' Taux de rendement interne de l'opération
            ''' </summary>
            ''' <remarks></remarks>
            Public Property TRI As Double

            ''' <summary>
            ''' Indique si le TRI s'est correctement calculé
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property isTRIvalide As Boolean

            ''' <summary>
            ''' Rentabilité de l'opération
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Rentabilite As Double

            ''' <summary>
            ''' Valeur actuelle nette de l'opération
            ''' </summary>
            ''' <remarks></remarks>
            Public Property VAN As Double

            ''' <summary>
            ''' Valeur actuelle nette des primes
            ''' </summary>
            ''' <remarks></remarks>
            Public Property VANprimes As Double

            ''' <summary>
            ''' Fait une copie des données
            ''' </summary>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function Copy() As ResultatsIndicateurs
                Dim result As New ResultatsIndicateurs
                Dim ROE_resNetsFdsPropres_copy(ROE_resNetsFdsPropres.Count - 1) As Double
                Dim ROE_resNetsCapiAlloues_copy(ROE_resNetsCapiAlloues.Count - 1) As Double
                Dim SP_techDC_copy(SP_techDC.Count - 1) As Double
                Dim SP_techINCINV_copy(SP_techINCINV.Count - 1) As Double
                Dim SP_techTot_copy(SP_techTot.Count - 1) As Double
                For i = 0 To ROE_resNetsFdsPropres.Count - 1
                    ROE_resNetsFdsPropres_copy(i) = ROE_resNetsFdsPropres(i)
                    ROE_resNetsCapiAlloues_copy(i) = ROE_resNetsCapiAlloues(i)
                    SP_techDC_copy(i) = SP_techDC(i)
                    SP_techINCINV_copy(i) = SP_techINCINV(i)
                    SP_techTot_copy(i) = SP_techTot(i)
                Next
                result.ROE_resNetsFdsPropres = ROE_resNetsFdsPropres_copy
                result.ROE_resNetsCapiAlloues = ROE_resNetsCapiAlloues_copy
                result.SP_techDC = SP_techDC_copy
                result.SP_techINCINV = SP_techINCINV_copy
                result.SP_techTot = SP_techTot_copy
                result.TRI = TRI
                result.isTRIvalide = isTRIvalide
                result.Rentabilite = Rentabilite
                result.VAN = VAN
                result.VANprimes = VANprimes
                Return result
            End Function
        End Class

    End Class


End Namespace